﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BusinessLogic;


namespace Presentation.contenido
{
    public partial class entradaUsuario : System.Web.UI.Page
    {
        //Se declara la variable que almacenara el nombre del tecnico asignado a la solicitud seleccionada.
        private string nomTecnico;
        //Se declara la variable que almacena el estado de una solicitud seleccionada.
        bool abierta = false;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Se carga el GridView de Tickets cerrados o cancelados.
                gvCerrados.DataSource = Sistema.getInstancia().getSolicitudesCerrOrCancByNroUsu(long.Parse(Session["NroFunc"].ToString()));
                gvCerrados.DataBind();

                //Se carga el GridView de Tickets abiertos.
                gvAbiertos.DataSource = Sistema.getInstancia().getSolicitudesAbiertasByNroUsu(long.Parse(Session["NroFunc"].ToString()));
                gvAbiertos.DataBind();

                //Se desactiva los multiview de Informacion de tickets y respuestas.
                mvSelTicket.ActiveViewIndex = -1;
                mvRespuestas.ActiveViewIndex = -1;

                //Se deshabilita el boton responder.
                btnResponder.Enabled = false;

                //Se desabilita el panel de los detalles de los comentarios.
                pComDetalles.Visible = false;

                //Se limpia la variable de sesion UnMens.
                Session["UnMens"] = null;
            }
        }

        protected void gvCerrados_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Se cambia el valor de la variable global "abierta" que indica el estado del ticket seleccionado.
            abierta = false;
            //Se hace visible el view de Informacion de tickets.
            mvSelTicket.ActiveViewIndex = 0;
            Solicitud unaS = Sistema.getInstancia().getSolicitudByNro(long.Parse(gvCerrados.SelectedRow.Cells[0].Text));
            fillFormSolicitud(unaS);
            //Se desabilita el panel que contiene el boton "Cancelar".
            pCancelar.Visible = false;
            
        }

        protected void gvAbiertos_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Se cambia el valor de la variable global "abierta" que indica el estado del ticket seleccionado.
            abierta = true;
            Solicitud unaS = Sistema.getInstancia().getSolicitudByNro(long.Parse(gvAbiertos.SelectedRow.Cells[0].Text));
            fillFormSolicitud(unaS);
            //Se habilita el panel que contiene el boton "Cancelar".
            pCancelar.Visible = true;
        }

        //Llena el formulario de detalles de una solicitud.
        protected void fillFormSolicitud(Solicitud unaS)
        {
            //Se hace visible el view de Informacion de tickets.
            mvSelTicket.ActiveViewIndex = 0;
            lblNroTicket.Text = unaS.NroTicket.ToString();
            lblFechaCreado.Text = unaS.Creada.ToShortDateString();
            lblFechaCerrado.Text = unaS.Cerrada == null ? "Ninguna" : unaS.Cerrada.ToShortDateString();
            lblEstado.Text = unaS.Estado.ToString();
            //Se le asigna a la variable de session EstSol el estado de la solicitud seleccionada.
            Session["EstSol"] = unaS.Estado.ToString();
            //Si la solicitud no tiene un tecnico asignado le asigna el texto "Ninguno" al label.
            lblTecnico.Text = nomTecnico = unaS.UnTecnico == null ? "Ninguno" : unaS.UnTecnico.Nombre;
            lblAsunto.Text = unaS.Asunto;
            lblDesc.Text = unaS.Descripcion;
            //Se cargan en la variable global lstMensajes si los hay, los comentarios relacionados a la solicitud.
            Session["LstMens"] = unaS.LstMensajes;
            //Se limpia el formulario de comentarios y respuestas.
            limpiarForm();
            if (Session["LstMens"] != null)
            {
                //Se carga la variable de session UnMens con el ultimo elemento de la lista de mensajes.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[((List<Mensaje>)Session["LstMens"]).Count() - 1];
                //Se hace visible el panel de detalles de comentarios.
                pComDetalles.Visible = true;
                //Se carga el formulario con los datos del comentario.
                fillFormComentarios();
            }
            else
            {
                Session["UnMens"] = null;
                pComDetalles.Visible = false;
                mvRespuestas.ActiveViewIndex = -1;
            }
        }
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            //Se cancela la solicitud enviando el estado "Cerrado" y el numero del ticket que esta seleccionado.
            Sistema.getInstancia().setEstadoSolicitud(enEstado.Cancelado, long.Parse(lblNroTicket.Text));
            //Se recarga la pagina para que se acutalicen los gridview.
            Response.Redirect("entradaUsuario.aspx");
        }

        private void fillFormComentarios()
        {
            //Se limpia el formulario de comentarios y respuestas.
            limpiarForm();
            Mensaje unM = (Mensaje)Session["UnMens"];
            //Llena el formulario con los datos de un objeto Mensaje que se recibe como parametro.
            lblNumCom.Text = (((List<Mensaje>)Session["LstMens"]).Count() - ((List<Mensaje>)Session["LstMens"]).IndexOf(unM)).ToString();
            lblTotCom.Text = ((List<Mensaje>)Session["LstMens"]).Count().ToString();
            lblComFecha.Text = unM.Fecha.ToShortDateString();
            lblComentario.Text = unM.Texto;
            //Se habilitan o deshabilitan los botones de Anterior y Siguiente, segun la disponibilidad de mas comentarios.
            setEnabledSigAnt();
            //Se crea una lista de tipo respuesta y se intenta llenar con respuestas relacionadas con el mensaje.
            List<Respuesta> lstRespuestas = Respuesta.getRespuestaByNroMensaje(unM.Id);
            if (lstRespuestas != null)
            {
                fillFormRespuesta(lstRespuestas[0]);
            }
            else
            {
                //En caso de que no haya respuestas para el comentario actual y el estado de la solicitud sea "Abierto", 
                //se hace visible el view que permite insertar una respuesta.
                if (Session["EstSol"] == enEstado.Abierto.ToString())
                {
                    mvRespuestas.ActiveViewIndex = 0;
                    btnResponder.Enabled = true;
                }
                else
                {
                    mvRespuestas.ActiveViewIndex = -1;
                }
            }
        }

        private void fillFormRespuesta(Respuesta pRes)
        {
            //Se hace visible el panel de respuestas.
            mvRespuestas.ActiveViewIndex = 1;
            //Llena el formulario de respuesta con los dato de un objeto Respuesta que recibe como parametro.
            lblResFecha.Text = pRes.Fecha.ToShortDateString();
            lblRespuesta.Text = pRes.Texto;
        }
        private void limpiarForm()
        {
            //Limpia el formulario de preguntas.
            lblNumCom.Text = "";
            lblTotCom.Text = "";
            lblComFecha.Text = "";
            lblComentario.Text = "";
            //Limpiar el formulario de respuestas.
            lblResFecha.Text = "";
            lblRespuesta.Text = "";
        }

        //Habilita o deshabilita los botones de anterior y siguiente.
        protected void setEnabledSigAnt()
        {
            //Se declara una lista de mensajes y se le asigna un parseo de la que se encuentra en la variable de session.
            List<Mensaje> lstMensajes = ((List<Mensaje>)Session["LstMens"]);
            Mensaje unMens = (Mensaje)Session["UnMens"];
            int indice = lstMensajes.IndexOf(unMens);
            //Si la lista de mensajes solo contiene un mensaje, se deshabilitan ambos botones.
            //RECORDAR QUE LA LISTA DE MENSAJES ESTA ORDENADA POR FECHA EN ORDEN DESCENDIENTE, POR LO QUE EL PRIMER ITEM DE LA LISTA
            //SERA EL MAS RECIENTE Y EL ULTIMO, EL MAS ANTIGUO.
            if (lstMensajes.Count() == 1)
            {
                //Si hay solo un comentario, se anulan ambos botones.
                btnSiguiente.Enabled = false;
                btnAnterior.Enabled = false;
            }
            else if (indice < (lstMensajes.Count() - 1) && indice > 0)
            {
                //Si existe tanto un anterior como un posterior, se habilitan ambos botones.
                btnAnterior.Enabled = true;
                btnSiguiente.Enabled = true;
            }
            else if (indice == (lstMensajes.Count() - 1))
            {
                btnAnterior.Enabled = true;
                btnSiguiente.Enabled = false;
            }
            else if (indice == 0 && lstMensajes.Count() > 1)
            {
                btnSiguiente.Enabled = true;
                btnAnterior.Enabled = false;
            }

        }

        protected void btnAnterior_Click(object sender, EventArgs e)
        {
            int indice = ((List<Mensaje>)Session["LstMens"]).IndexOf((Mensaje)Session["UnMens"]);
            //Se controla que haya un comentario anterior

            if (indice > 0)
            {
                //La lista de mensajes almacenada esta ordenada por fecha en orden descendente,
                //por lo que para ir a un comentario posterior se retrocede en vez de avanzar.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[indice - 1];
                fillFormComentarios();
            }
        }

        protected void btnSiguiente_Click(object sender, EventArgs e)
        {
            int indice = ((List<Mensaje>)Session["LstMens"]).IndexOf((Mensaje)Session["UnMens"]);
            //Se controla que haya un comentario siguiente.
            if (indice < (((List<Mensaje>)Session["LstMens"]).Count() - 1))
            {
                //La lista de mensajes almacenada esta ordenada por fecha en orden descendente,
                //por lo que para ir a un comentario anterior se avanza en vez de retroceder.
                Session["UnMens"] = ((List<Mensaje>)Session["LstMens"])[indice + 1];
                fillFormComentarios();
            }
        }

        protected void btnResponder_Click(object sender, EventArgs e)
        {
            //Si existe algun mensaje al que responder y se ha seleccionado una solicitud en alguno de los gridview...
            if (Session["UnMens"] != null && lblNroTicket.Text != "")
            {
                Respuesta unaR = new Respuesta();
                unaR.IdMensaje = ((Mensaje)Session["UnMens"]).Id;
                unaR.Texto = txtRespuesta.Text;
                unaR.insertRespuesta(long.Parse(lblNroTicket.Text));
                //Se refresca la pagina para reflejar los cambios realizados en las listas.
                Response.Redirect("entradaUsuario.aspx");
            }

        }
    }
}